<?php
/**
 * 月間スケジュールデータモジュール
 */
require_once 'Xml.php';

/**
 * 月間スケジュールデータクラス
 * @author admin
 *
 */
class Models_Schedule_Xml_Controller extends Lib_Abstract_Xml
{
	/** 予定識別 */
	const KEY_REQ_ACT 	= "ACT";
	/** 年 */
	const KEY_REQ_YEAR 	= 'Y';
	/** 月 */
	const KEY_REQ_MONTH = 'M';
	/** 日 */
	const KEY_REQ_DAY	= 'D';

	/** 予定識別 */
	const KEY_ID = 'ID';
	/** 年 */
	const KEY_YEAR = 'YEAR';
	/** 月 */
	const KEY_MONTH = 'MONTH';
	/** 日 */
	const KEY_DAY = 'DAY';
	/** 時 */
	const KEY_HOUR = 'HOUR';
	/** 分 */
	const KEY_MINUTE = 'MINUTE';
	/** 時間 */
	const KEY_HOURS = 'HOURS';
	/** 場所 */
	const KEY_PLACE = 'PLACE';
	/** 種別コード（試合、練習、レクレーション）*/
	const KEY_KIND = 'KIND';
	/** 年齢 */
	const KEY_AGE = 'AGE';
	/** 予定中止フラグ */
	const KEY_STOPFLG = 'STOPFLG';
	/** お知らせ */
	const KEY_INFO = 'INFO';

	/**
	 * 月間スケジュールクラスコンストラクタ
	 * @param $strFileName スケジュールデータＸＭＬファイル名
	 */
	public function __construct( $strFileName )
	{
		/** カレントディレクトリを指しているのであれば */
		if ( dirname( $strFileName ) == '.' ) {
			$strFileName = $this->getDefaultSavePath() . $strFileName;
		}
		parent::__construct( $strFileName );
		$this->_deleteNullDataset();
	}

	/**
	 * デフォルト保存ディレクトリを返す
	 */
	public static function getDefaultSavePath()
	{
		$strResult = dirname( __FILE__ ) . '/databox/';
		return $strResult;
	}

	/**
	 * 予定ＩＤを作成する
	 * @return float
	 */
	public static function createId()
	{
		$aryDivide = explode( ' ', microtime() );
		$iResult = $aryDivide[0] + $aryDivide[1];
		return $iResult;
	}

	/**
	 * 更新
	 * @param unknown_type $ary 更新対象連想配列
	 * @param unknown_type $iYear 年
	 * @param unknown_type $iMonth 月
	 * @param unknown_type $iDay 日
	 * @param unknown_type $iHour 時
	 * @param unknown_type $iMinute 分
	 * @param unknown_type $iHours 時間
	 * @param unknown_type $strPlace 場所
	 * @param unknown_type $strKind 種別
	 * @param unknown_type $strAge 年齢
	 * @param unknown_type $strId 予定識別
	 * @param unknown_type $strStopFlg 予定中止フラグ
	 * @param unknown_type $strInfo お知らせ
	 */
	public static function modifyData(
		&$ary,
		$iYear,
		$iMonth,
		$iDay,
		$iHour,
		$iMinute,
		$iHours,
		$strPlace,
		$strKind,
		$strAge,
		$strId,
		$strStopFlg,
		$strInfo=''
	)
	{
		$ary = array(
			self::KEY_ID => $strId,
			self::KEY_YEAR => $iYear,
			self::KEY_MONTH => $iMonth,
			self::KEY_DAY => $iDay,
			self::KEY_HOUR => $iHour,
			self::KEY_MINUTE => $iMinute,
			self::KEY_HOURS => $iHours,
			self::KEY_PLACE => $strPlace,
			self::KEY_KIND => $strKind,
			self::KEY_AGE => $strAge,
			self::KEY_STOPFLG => $strStopFlg,
			self::KEY_INFO => $strInfo
		);
	}

	/**
	 * 年月日から予定を検索する
	 * @param unknown_type $strYear 年
	 * @param unknown_type $strMonth 月
	 * @param unknown_type $strDay 日
	 */
	public function searchDate( $strYear, $strMonth, $strDay )
	{
		$aryResult = array();
		/** 全件処理 */
		foreach ( $this->_aryXml['LIST'] as $aryData ) {
			/** 年月日判定 */
			if
			(
				($aryData[self::KEY_YEAR] == $strYear) &&
				($aryData[self::KEY_MONTH] == $strMonth) &&
				($aryData[self::KEY_DAY] == $strDay)
			)
			{
				$aryResult[] = $aryData;
			}
		}

		return $aryResult;
	}

	/**
	 * タグ名と値に一致する予定を検索する
	 * @param unknown_type $strKeyName タグ名
	 * @param unknown_type $strValue 値
	 */
	public function searchKey( $strKeyName, $strValue )
	{
		$arySrc = $this->_searchStructArray( $this->_aryXml, $strKeyName, $strValue);
		return $arySrc;
	}

	/**
	 * 追加
	 * @param unknown_type $iYear 年
	 * @param unknown_type $iMonth 月
	 * @param unknown_type $iDay 日
	 * @param unknown_type $iHour 時
	 * @param unknown_type $iMinute 分
	 * @param unknown_type $iHours 時間
	 * @param unknown_type $strPlace 場所
	 * @param unknown_type $strKind 種別
	 * @param unknown_type $strAge 年齢
	 * @param unknown_type $strId 予定識別
	 * @param unknown_type $strStopFlg 予定中止フラグ
	 * @param unknown_type $strInfo お知らせ
	 */
	public function putData(
		$iYear,
		$iMonth,
		$iDay,
		$iHour,
		$iMinute,
		$iHours,
		$strPlace,
		$strKind,
		$strAge,
		$strId = '',
		$strStopFlg = '',
		$strInfo = ''
	)
	{
		/** 予定識別が指定されていた場合は検索する */
		if ( $strId != '' ) {
			$arySrc
			= &$this->_searchStructArray(
				$this->_aryXml,
				self::KEY_ID, $strId
			);
			/** 予定中止フラグ設定 */
			if ( $strStopFlg == '' ) {
				/** 設定 */
				if ( isset( $arySrc[self::KEY_STOPFLG] ) ) {
					$strStopFlg = $arySrc[self::KEY_STOPFLG];
				}
			}
			/** 更新対象が見つかったか */
			if ( $arySrc !== FALSE ) {
				$this->modifyData(
					$arySrc,
					$iYear,
					$iMonth,
					$iDay,
					$iHour,
					$iMinute,
					$iHours,
					$strPlace,
					$strKind,
					$strAge,
					$strId,
					$strStopFlg,
					$strInfo
				);
			} else {
				$aryNew = array();
				$this->modifyData(
					$aryNew,
					$iYear,
					$iMonth,
					$iDay,
					$iHour,
					$iMinute,
					$iHours,
					$strPlace,
					$strKind,
					$strAge,
					$strId,
					$strStopFlg,
					$strInfo
				);
				$this->_aryXml['LIST'][] = $aryNew;
			}
		} else {
			$aryNew = array();
			$this->modifyData(
					$aryNew,
					$iYear,
					$iMonth,
					$iDay,
					$iHour,
					$iMinute,
					$iHours,
					$strPlace,
					$strKind,
					$strAge,
					$this->createId(),
					$strStopFlg,
					$strInfo
			);
			$this->_aryXml['LIST'][] = $aryNew;
		}
	}

	/**
	 * 削除
	 * @param unknown_type $strId 予定識別
	 */
	public function delete( $strId )
	{
		$iCount = count($this->_aryXml['LIST']);
		$i = 0;
		/** 全件検索 */
		while ( $i < $iCount ) {
			/** 予定識別判定 */
			if ( $this->_aryXml['LIST'][$i][self::KEY_ID] == $strId ) {
				unset($this->_aryXml['LIST'][$i]);
			}
			$i ++;
		}
	}

	/**
	 * 無効データ削除
	 */
	protected function _deleteNullDataset()
	{
		$iCount = count( $this->_aryXml['LIST'] );
		$i = 0;
		/** 全件検索 */
		while ( $i < $iCount ) {
			/** 無効データ判定 */
			if ( !isset( $this->_aryXml['LIST'][$i][self::KEY_ID] ) ) {
				unset ($this->_aryXml['LIST'][$i]);
			} else if ( trim( $this->_aryXml['LIST'][$i][self::KEY_ID] ) == '' ) {
				unset ($this->_aryXml['LIST'][$i]);
			}
			$i ++;
		}
	}

	/**
	 * 予定返却
	 * 年齢によるフィルタリング
	 * @see Lib_Abstract_Xml::getArrayData()
	 * @return array
	 */
	public function getArrayData( $aryAgeFilter = '' )
	{
		$aryData = parent::getArrayData();
		/** 年齢指定がなければ全件返却 */
		if ( $aryAgeFilter == '' ) {
			return $aryData;
		}
		/** 年齢指定がなければ全件返却 */
		if ( count( $aryAgeFilter ) == 0 ) {
			return $aryData;
		}

		$aryResult = array();
		/** 全件処理 */
		if ( is_array($aryData) ) {
			foreach ( $aryData['LIST'] as $aryDataset ) {
				/** 年齢フィルタ指定全件処理 */
				foreach ( $aryAgeFilter as $strAgeFilter ) {
					/** フィルタリング対象判定 */
					if ( strpos($aryDataset[self::KEY_AGE], $strAgeFilter) !== FALSE ) {
						$aryResult[] = $aryDataset;
						break;
					}
				}
			}
		}
		$aryReal['LIST'] = $aryResult;
		return $aryReal;
	}

	/**
	 * 強制リストタグ指定(non-PHPdoc)
	 * @see Lib_Abstract_Xml::_setForceEnum()
	 */
	public function _setForceEnum()
	{
		$this->_aryForceEnum = array( 'LIST' );
	}

	/**
	 * 月間予定データファイル名作成
	 * @return string
	 */
	public static function createScheduleDataFileName()
	{
		/** 年パラメータ */
		if ( isset( $_REQUEST[self::KEY_REQ_YEAR] ) ) {
			$strYear = $_REQUEST[self::KEY_REQ_YEAR];
		} else {
			$strYear = date('Y');
		}
		/** 月パラメータ */
		if ( isset( $_REQUEST[self::KEY_REQ_MONTH] ) ) {
			$strMonth = $_REQUEST[self::KEY_REQ_MONTH];
		} else {
			$strMonth = date('n');
		}

		/** ゼロサプレス */
		if ( strlen( $strMonth ) == 1 ) {
			$strMonth = '0' . $strMonth;
		}

		$strResult = $strYear . $strMonth . '.xml';
		return $strResult;
	}

	/**
	 * Uage
	 * Enter description here ...
	 * @param unknown_type $strUnderAge
	 */
	public static function combUnderAgeToGrade($strUnderAge)
	{
		$aryDic = array(
			"U6"=>"幼稚園",
			"U7"=>"１年生",
			"U8"=>"２年生",
			"U9"=>"３年生",
			"U10"=>"４年生",
			"U11"=>"５年生",
			"U12"=>"６年生",
		);

		$sResult = '';
		$aryUnderAgeList = explode(',', $strUnderAge);
		/** 辞書検索 */
		foreach ( $aryUnderAgeList as $strAge ) {
			/** 一致 */
			if ( key_exists($strAge, $aryDic) ) {
				/** 結合 */
				if ( $sResult != '' ) {
					$sResult .= '、';
				}
				$sResult .= $aryDic[$strAge];
			}
		}

		return $sResult;
	}

}